package org.study.module.hive;

import org.study.module.common.AbstractConfigBuilder;
import org.study.module.common.ModuleCommon;

import java.util.ArrayList;
import java.util.List;

public class HiveConfigBuilder  extends AbstractConfigBuilder {

    /**
     * 元数据存储，数据库链接地址
     * MySQL：jdbc:mysql://hive-m1:3306,hive-m2:3306/hive_meta
     *
     */
    public HiveConfigBuilder connectionURL(String connectionURL){
        addMessage("Hive元数据存储,数据库地址");
        addProperty("javax.jdo.option.ConnectionURL", connectionURL);
        return this;
    }

    /**
     * com.mysql.cj.jdbc.Driver
     */
    public HiveConfigBuilder connectionDriverName(String driverName){
        addMessage("Hive元数据存储,数据库驱动");
        addProperty("javax.jdo.option.ConnectionDriverName", driverName);
        return this;
    }
    public HiveConfigBuilder connectionUserName(String userName){
        addMessage("Hive元数据存储,数据库用户名");
        addProperty("javax.jdo.option.ConnectionUserName", userName);
        return this;
    }
    public HiveConfigBuilder connectionPassword(String password){
        addMessage("Hive元数据存储,数据库用户密码");
        addProperty("javax.jdo.option.ConnectionPassword", password);
        return this;
    }
    public HiveConfigBuilder metastoreWarehouseDir(String warehouseDir){
        addMessage("Hive元数据存储,数据库用户密码");
        addProperty("hive.metastore.warehouse.dir", warehouseDir);
        return this;
    }
    public HiveConfigBuilder execScratchDir(String scratchDir){
        addMessage("Hive元数据存储,数据库用户密码");
        addProperty("hive.exec.scratchdir", scratchDir);
        return this;
    }
    public HiveConfigBuilder queryLogLocation(String logLocation){
        addMessage("Hive元数据存储,数据库用户密码");
        addProperty("hive.querylog.location", logLocation);
        return this;
    }

    /**
     *
     * @param metastoreUris 元数据提供地址 如：thrift://hive-m1:9083,thrift://hive-m2:9083
     */
    public HiveConfigBuilder metastoreUris(String metastoreUris){
        addMessage("Metastore服务配置");
        addProperty("hive.metastore.uris", metastoreUris);
        return this;
    }

    /**
     *
     * @param thriftPort 如：10000
     * @return
     */
    public HiveConfigBuilder server2ThriftPort(String thriftPort){
        addMessage("HiveServer2配置");
        addProperty("hive.server2.thrift.port", thriftPort);
        return this;
    }
    public HiveConfigBuilder server2EnableDoAs(){
        addMessage("需配置权限");
        addProperty("hive.server2.enable.doAs", "true");
        return this;
    }

    /**
     *
     * @param thriftBindHost  如：0.0.0.0
     */
    public HiveConfigBuilder server2ThriftBindHost(String thriftBindHost){
        addMessage("HiveServer2配置");
        addProperty("hive.server2.thrift.bind.host", thriftBindHost);
        return this;
    }

    public HiveConfigBuilder supportConcurrency(){
        addMessage("启用并发（Hive 4.0增强）");
        addProperty("hive.support.concurrency", "true");
        return this;
    }
    public HiveConfigBuilder txnManager(){
        addMessage("支持ACID");
        addProperty("hive.txn.manager", "org.apache.hadoop.hive.ql.lockmgr.DbTxnManager<");
        return this;
    }
    public HiveConfigBuilder server2ZookeeperNamespace(){
        addMessage("Zookeeper服务发现（用于HiveServer2负载均衡）");
        addProperty("hive.server2.zookeeper.namespace", "hiveserver2");
        return this;
    }

    /**
     *
     * @param zookeeperQuorum 如：zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
     */
    public HiveConfigBuilder zookeeperQuorum(String zookeeperQuorum){
        addMessage("Zookeeper服务发现（用于HiveServer2负载均衡）");
        addProperty("hive.zookeeper.quorum", zookeeperQuorum);
        return this;
    }

    /**
     * hive进行KERBEROS认证
     * @param hostName  当前机器的hostname
     * @param kerberosPath 存储位置
     */
    public HiveConfigBuilder kerberos(String hostName,String kerberosPath){
        addMessage("认证的类型");
        addProperty("hive.server2.authentication", "KERBEROS");
        addMessage("KERBEROS，主体");
        addProperty("hive.server2.authentication.kerberos.principal", "hive/"+hostName);
        addMessage("KERBEROS ，存储位置-->");
        addProperty("hive.server2.authentication.kerberos.keytab", kerberosPath);
        return this;
    }

    /**
     * 设置Hive的执行引擎为Spark
     */
    public HiveConfigBuilder spark() {
        addMessage("指定执行引擎为 Spark");
        addProperty("hive.execution.engine", "spark");
        addMessage("Spark 主节点地址（yarn 模式或 standalone 模式）");
        addProperty("spark.master", "yarn");
        return this;
    }

    /**
     * Spark JAR 包位置（需与实际 Spark 安装路径匹配）
     *
     * @param hdfsJars 如：hdfs:///spark/jars/*
     */
    public HiveConfigBuilder sparkYarnJars(String hdfsJars) {
        addMessage("Spark JAR 包位置（需与实际 Spark 安装路径匹配） hdfs:///spark/jars/*-->");
        addProperty("spark.yarn.jars", hdfsJars);
        return this;
    }

    /**
     * Spark 应用名称前缀
     *
     * @param name 名称  如：spark-on-hive
     */
    public HiveConfigBuilder sparkAppName(String name) {
        addMessage("Spark 应用名称前缀");
        addProperty("spark.app.name", name);
        return this;
    }

    /**
     * Spark 初始 Executor 数量
     * 总核心数 = 实例数 × 单实例核心数，建议总核心数为集群可用核心的 70%-80%（预留资源给其他任务）
     *
     * @param instances Executor 数量 如：10
     */
    public HiveConfigBuilder sparkExecutorInstances(String instances) {
        addMessage("最大 Executor 数量 10-->");
        addProperty("spark.executor.instances", instances);
        return this;
    }

    /**
     * 单个 Executor 的 CPU 核心数
     * 2-5 核（核心过多会导致资源竞争，过少则并行度不足）
     *
     * @param cores 核数，如：3
     */
    public HiveConfigBuilder sparkExecutorCores(String cores) {
        addMessage("每个 Executor 的核心数");
        addProperty("spark.executor.cores", cores);
        return this;
    }

    /**
     * 单个 Spark Executor 内存
     * 4-16G（根据数据量调整，建议不超过 16G，否则 GC 效率低）
     *
     * @param memory 内存大小 如：4g
     */
    public HiveConfigBuilder sparkExecutorMemory(String memory) {
        addMessage("Spark Executor 内存 ");
        addProperty("spark.executor.memory", memory);
        return this;
    }

    /**
     * Spark Driver CPU 核心数
     * 1-2 核（Driver 计算压力小，够用即可）
     *
     * @param cores 核数，如：1
     */
    public HiveConfigBuilder sparkDriverCores(String cores) {
        addMessage("Driver CPU 核心数");
        addProperty("spark.driver.cores", cores);
        return this;
    }

    /**
     * Driver 内存（处理元数据、任务调度）
     * 2-8G（小集群 2-4G，大集群 4-8G，避免 OOM）
     *
     * @param memory 内存大小 如：2g
     */
    public HiveConfigBuilder sparkDriverMemory(String memory) {
        addMessage("Spark 驱动程序内存");
        addProperty("spark.driver.memory", memory);
        return this;
    }

    /**
     * Spark 开启动态资源分配，设置最大和最小Executors数量，确保 Executor 退出后 Shuffle 数据不丢失
     * @param minExecutors 最小 Executor 数 如：2-5（保证基础并发能力）
     * @param maxExecutors 最大 Executor 数 如：根据集群总资源设置（如 50-100）
     */
    public HiveConfigBuilder sparkDynamicAllocation(String minExecutors, String maxExecutors) {
        addMessage("Spark 开启动态资源分配");
        addProperty("spark.dynamicAllocation.enabled", "true");
        addMessage("最小 Executor 数");
        addProperty("spark.dynamicAllocation.minExecutors", minExecutors);
        addMessage("最大 Executor 数");
        addProperty("spark.dynamicAllocation.maxExecutors", maxExecutors);
        addMessage("启用外部 Shuffle 服务（YARN 模式）");
        addProperty("spark.shuffle.service.enabled", "true");
        return this;
    }
}
